package com.gzz.orchid.common.webmvc.support.vistlog;

import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;

/**
 * @author higmd
 * 访问日志事件监听接口
 */
public interface IVisitLogEventListener {

    /**
     * 访问日志事件监听
     *
     * @param event 日志事件
     */
    @Async("asyncExecutor")
    @EventListener
    void listenVisitLogEvt(VisitLogEvent event);

    /**
     * Spring的事件监听机制（发布订阅模型）实际上并不是异步的（默认情况下），
     * 而是同步的来将代码进行解耦。即处理事件和发布事件的线程是同一个。
     * 可以通过@Async进行异步处理。而@TransactionEventListener仍是通过这种方式，
     * 只不过加入了回调的方式来解决，这样就能够在事务进行Commited，Rollback…等的时候才会去进行Event的处理，达到事务同步的目的。
     *
     * @TransactionalEventListener可以通过phase属性指定触发阶段，有四种：
     *
     *     BEFORE_COMMIT：在事务提交之前触发事件。
     *     AFTER_COMMIT：在成功完成提交后触发事件。这是默认的触发阶段。
     *     AFTER_ROLLBACK：如果事务已回滚，则触发事件。
     *     AFTER_COMPLETION：事务完成之后（无论是提交还是回滚）进行触发。如果同时注册AFTER_COMPLETION和AFTER_ROLLBACK/AFTER_COMMIT事件，
     *     那么触发的先后顺序是不固定的，但是可以使用@Order注解指定先后顺序。
     *
     * @TransactionalEventListener标注的监听器方法，在默认情况下仅仅会被事务中发布的事件触发，
     * 如果需要在没有事务也能当作普通时间监听器触发，那么需要将fallbackExecution属性设置为true。
     * @param evt
     */
    //    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT,fallbackExecution = true)
    //    void listenVisitLoggerEvent(VisitLogEvent evt);
}
